package internal

import (
	"context"
	"github.com/gogf/gf/v2/database/gdb"
	"github.com/gogf/gf/v2/frame/g"
)

type UserDao struct {
	table     string            // 表名称
	group     string            // 数据源分组，默认default
	columns   UserColumns       // 表字段
	columnMap map[string]string //表字段map
}

// UserColumns defines and stores column names for table gen_database.
type UserColumns struct {
	Id                    string //ID
	TenantCode            string //租户编码
	LoginName             string //用户名
	Email                 string //邮箱
	HashPassword          string //Hash后的用户密码
	RealName              string //用户真实姓名
	Phone                 string //手机号码
	ImageUrl              string //用户头像地址
	ProfilePhoto          string //用户二进制头像
	Language              string //语言
	TimeZone              string //时区
	LastPasswordUpdatedAt string //上一次密码更新时间
	LastLoginAt           string //上一次登陆时间
	IsLocked              string //是否锁定账户
	IsAdmin               string //是否为管理员用户。1表示是，0表示不是
	LockedUntilAt         string //锁定账户截止时间
	PasswordAttempt       string //密码输错累积次数
	UserType              string //用户类型(P/C)，平台用户/C端用户，默认P
	Creator               string //创建人
	CreatorId             string //创建人id
	CreateDate            string //创建时间
	Modifier              string //修改者
	ModifierId            string //修改者id
	ModifyDate            string //修改时间
	State                 string //状态（1正常 0停用）
	VersionNumber         string //版本号
}

//  userColumns holds the columns for table mes_gf_mst_yield_line.
var userColumns = UserColumns{
	Id:                    "id",                       //ID
	TenantCode:            "tenant_code",              //租户编码
	LoginName:             "login_name",               //用户名
	Email:                 "email",                    //邮箱
	HashPassword:          "hash_password",            //Hash后的用户密码
	RealName:              "real_name",                //用户真实姓名
	Phone:                 "phone",                    //手机号码
	ImageUrl:              "image_url",                //用户头像地址
	ProfilePhoto:          "profile_photo",            //用户二进制头像
	Language:              "language",                 //语言
	TimeZone:              "time_zone",                //时区
	LastPasswordUpdatedAt: "last_password_updated_at", //上一次密码更新时间
	LastLoginAt:           "last_login_at",            //上一次登陆时间
	IsLocked:              "is_locked",                //是否锁定账户
	IsAdmin:               "is_admin",                 //是否为管理员用户。1表示是，0表示不是
	LockedUntilAt:         "locked_until_at",          //锁定账户截止时间
	PasswordAttempt:       "password_attempt",         //密码输错累积次数
	UserType:              "user_type",                //用户类型(P/C)，平台用户/C端用户，默认P
	Creator:               "creator",                  //创建人
	CreatorId:             "creator_id",               //创建人id
	CreateDate:            "create_date",              //创建时间
	Modifier:              "modifier",                 //修改者
	ModifierId:            "modifier_id",              //修改者id
	ModifyDate:            "modify_date",              //修改时间
	State:                 "state",                    //状态（1正常 0停用）
	VersionNumber:         "version_number",           //版本号
}
var userColumnMap = map[string]string{
	"Id":                    "id",                       //ID
	"TenantCode":            "tenant_code",              //租户编码
	"LoginName":             "login_name",               //用户名
	"Email":                 "email",                    //邮箱
	"HashPassword":          "hash_password",            //Hash后的用户密码
	"RealName":              "real_name",                //用户真实姓名
	"Phone":                 "phone",                    //手机号码
	"ImageUrl":              "image_url",                //用户头像地址
	"ProfilePhoto":          "profile_photo",            //用户二进制头像
	"Language":              "language",                 //语言
	"TimeZone":              "time_zone",                //时区
	"LastPasswordUpdatedAt": "last_password_updated_at", //上一次密码更新时间
	"LastLoginAt":           "last_login_at",            //上一次登陆时间
	"IsLocked":              "is_locked",                //是否锁定账户
	"IsAdmin":               "is_admin",                 //是否为管理员用户。1表示是，0表示不是
	"LockedUntilAt":         "locked_until_at",          //锁定账户截止时间
	"PasswordAttempt":       "password_attempt",         //密码输错累积次数
	"UserType":              "user_type",                //用户类型(P/C)，平台用户/C端用户，默认P
	"Creator":               "creator",                  //创建人
	"CreatorId":             "creator_id",               //创建人id
	"CreateDate":            "create_date",              //创建时间
	"Modifier":              "modifier",                 //修改者
	"ModifierId":            "modifier_id",              //修改者id
	"ModifyDate":            "modify_date",              //修改时间
	"State":                 "state",                    //状态（1正常 0停用）
	"VersionNumber":         "version_number",           //版本号
}

// NewUserDao creates and returns a new DAO object for table data access.
func NewUserDao() *UserDao {
	return &UserDao{
		group:     "default",
		table:     "sys_user",
		columns:   userColumns,
		columnMap: userColumnMap,
	}
}

// DB retrieves and returns the underlying raw database management object of current DAO.
func (dao *UserDao) DB() gdb.DB {
	return g.DB(dao.group)
}

// Table returns the table name of current dao.
func (dao *UserDao) Table() string {
	return dao.table
}

// Columns returns all column names of current dao.
func (dao *UserDao) Columns() UserColumns {
	return dao.columns
}

// ColumnMap returns all column map of current dao.
func (dao *UserDao) ColumnMap() map[string]string {
	return dao.columnMap
}

// Group returns the configuration group name of database of current dao.
func (dao *UserDao) Group() string {
	return dao.group
}

// Ctx creates and returns the Model for current DAO, It automatically sets the context for current operation.
func (dao *UserDao) Ctx(ctx context.Context) *gdb.Model {
	return dao.DB().Model(dao.table).Safe().Ctx(ctx)
}

// Transaction wraps the transaction logic using function f.
// It rollbacks the transaction and returns the error from function f if it returns non-nil error.
// It commits the transaction and returns nil if function f returns nil.
//
// Note that, you should not Commit or Rollback the transaction in function f
// as it is automatically handled by this function.
func (dao *UserDao) Transaction(ctx context.Context, f func(ctx context.Context, tx *gdb.TX) error) (err error) {
	return dao.Ctx(ctx).Transaction(ctx, f)
}
